;window.callbacksManager || (function(undefined) {
	window.functionsQueue = function(caller) {
		var liste = []
		,pointeur = -1
		,depile = function() {
			var fct;
			pointeur++;
			if(liste.length === pointeur) {
				pointeur = -1;
				return;
			}

			if(liste[pointeur].constructor === Array) {
				if(liste[pointeur][1]-- > 0) {
					fct = liste[pointeur][0];
				}
				else {
					remove(pointeur--);
					depile();
					return;
				}
			}
			else {
				fct = liste[pointeur];
			}
			if(typeof fct === 'function') {
				fct.continuer = depile;
				if(fct.call(caller) !== false) {
					depile();
				}
			}
		}
		,remove = function(idx) {
			var i, copie = [];
			for(i in liste) {
				if(i == idx)
					continue;
				copie[copie.length] = liste[i];
			}
			liste = copie;
		};
		return function(fct, iterations) {
			if(arguments.length === 0) {
				if(pointeur !== -1)
					return;
				depile();
			}
			else if(fct !== undefined) {
				if(fct.constructor === Array) {
					if(fct.length <= 2 && typeof fct[0] === 'function' && typeof fct[1] !== 'function') {
						arguments.callee(fct[0], fct[1] || iterations);
					}
					else {
						for(var i in fct) {
							arguments.callee(fct[i], iterations);
						}
					}
				}
				else {
					if(typeof fct !== 'function') {
						throw new Error('Impossible de mettre en attente autre chose qu\'une fonction');
					}
					if(typeof iterations === 'number') {
						fct = [fct, iterations];
					}
					liste[liste.length] = fct;
				}
			}
		};
	};

	window.callbacksManager = function(caller, callbacks) {
		var listes = []
		,cbm = function(liste, fct, iterations) {
			if(arguments.length === 1) {
				if(typeof liste === 'object') {
					for(var key in liste) {
						cbm(key, liste[key]);
					}
				}
				else if(listes[liste] !== undefined)
					return listes[liste]();
			}
			else if(arguments.length > 1) {
				if(listes[liste] === undefined) {
					listes[liste] = window.functionsQueue(caller);
				}
				listes[liste](fct, iterations);
			}
		};
		if(typeof callbacks === 'object') {
			for(var key in callbacks) {
				cbm(key, callbacks[key]);
			}
		}
		return cbm;
	};
})();